# 元组、列表

""" ** 元组&列表 ** """

""" 数据定义 """
# 元组 （圆括号，静态）：长度大小固定，无法增加删减或者改变（immutable）。
tup = (1, 2, 3, 4, 5, "任意类型")
print("元组：", tup)

# 列表（方括号，动态）：长度大小不固定，可以随意地增加、删减或者改变元素（mutable）。
lst = [1, 2, 3, 4, 5, "任意类型"]
print("列表：", lst)

# 列表和元组都可以随意嵌套：
list2 = [1, 2, 3, 4, 5, [6, 7, 8, 9]]
print("列表嵌套：", list2)
tuple2 = (1, 2, 3, 4, 5, (6, 7, 8, 9))
print("元组嵌套：", tuple2)

""" 修改元素 """
# 修改元组
# tuple[0] = 100  #报错：TypeError: 'tuple' object does not support item assignment
print("元组不可修改，否则会报错")
# 修改元素
lst[0] = 100
print("列表修改后：", lst)

""" 添加元素 """
# 元组本身无法改变，也不能追加元素，非要加只能创建新的元素。
newTup = tup + (100,)  # 元组拼接
print("元组拼接：", newTup)

# 列表追加元素
lst.append(100)
print("列表追加元素：", lst)

""" 元素查询 """
# 元素获取
print("元组获取[0]:", tuple2[0])
print("列表获取[0]:", lst[0])
# 支持负数索引
print("元组获取[-1]:", tuple2[-1])  # 倒数第一个元素
print("列表获取[-2]:", lst[-2])  # 倒数第二个元素

# 切片操作
print("元组切片[1:3]:", tuple2[1:3])
print("列表切片[1:3]:", lst[1:3])

""" 类型转换 """
# 两者也可以通过list()和tuple()函数相互转换
print("元组转列表：", list(tuple2))
print("列表转元组：", tuple(lst))

""" 其他常用的内置函数 """
# 查询类的函数
## 查询长度len(xx)
print("列表长度：", len(lst))
print("元组长度：", len(tup))
## count(item)表示统计列表/元组中item出现的次数
print("列表统计：", lst.count(1))
print("元组统计：", tup.count(1))
## index(item)表示返回列表/元组中item第一次出现的索引。
print("列表索引：", lst.index(2))
print("元组索引：", tup.index(1))

# 修改类的函数
## 元素复制两倍
print("列表复制：", lst * 2)
print("元组复制：", tup * 2)

## 排序
### 注意：Python不支持直接比较不同类型的对象，不然会报错
### 原地排序
### list.reverse()和list.sort()分别表示原地倒转列表和排序（注意，元组没有内置的这两个函数)。
lst = [
    4,
    7,
    6,
    5,
    9,
    8,
    3,
    1,
    2,
]
lst.sort()
print("列表原地排序：", lst)
lst.reverse()
print("列表原地倒转：", lst)

### 排序返回副本
print("列表排序：", sorted(lst))
tup = (7, 6, 5.7, 5, 4, 2, 3, 4, 9)
print("元组排序：", sorted(tup))
### 通过切片方式反转
print("列表反转：", lst[::-1])
print("元组反转：", tup[::-1])

# 删除
# pop() 默认移除并返回最后一个元素
print("列表删除pop:", lst.pop())
# 删除指定的元素(参数不是索引)
lst.remove(2)
print("列表删除remove:2 ", lst)
# 清空列表
lst.clear()
print("列表删除clear:", lst)
